//
//  main.m
//  第一个OC类-方法2
//
//  Created by 许文娟 on 2024/1/10.
//

#import <Foundation/Foundation.h>

//1、类的声明（属性+行为）
@interface Iphone:NSObject
//属性
{
    //默认OC对象中的属性不能直接访问
    
    @public  //属性公开
    float _model; //型号
    int _cpu;
    double _size; //尺寸
    int _color; //颜色
}
//行为
/*
 OC中的方法分为两类：类方法和对象方法
 类方法只能用了；类名调用，对象方法只能用对象调用
 OC中的类方法用+表示，对象方法用-表示
 规律：
     1、确认函数名称
     2、确认形参
     3、确认返回值
     4、确认返回值名称
 */
-(void)about;


//有返回值没有参数-读取短信
-(char *) loadMessage;

//有返回值有参数-打电话
//()括住参数的参数类型
//注意：OC中的方法如果有参数，那么每个参数的数据类型前面必须加上一个:，当前方法的名称是 call:
-(int) call: (int) number;

//有返回值，有多个 参数-发短信,方法名 sendMessageWithNumber:antContent:
-(int)sendMessageWithNumber: (int)number antContent:(char *)content;

//计算器
-(int)sumWithValue1:(int)value1 andValue2:(int)value2;
//类方法
+(int)sumWithValue1:(int)value1 andValue2:(int)value2;
@end

//2、编写类的实现
@implementation Iphone
//行为的实现
-(void)about
{
    //对象方法中向访问该对象的属性，可以直接_属性即可
    NSLog(@"sum=%i",[Iphone sumWithValue1:50 andValue2:50]);
    NSLog(@"size=%f,color=%i,model=%f,cpu=%i",_size,_color,_model,_cpu);
}

-(char *) loadMessage
{
    return "qqqq";
}

-(int) call: (int) number
{
    NSLog(@"打电话给%i",number);
    return 1;
}

-(int)sendMessageWithNumber: (int)number antContent:(char *)content
{
    NSLog(@"打电话给%i,内容是%s",number,content );
    return 1;
}

-(int)sumWithValue1:(int)value1 andValue2:(int)value2
{
    return value1+value2;
}

/*
 类方法和对象方法的区别
 0、对象方法以-开头
    类方法以+开头
 1、对象方法必须用对象调用
    类方法必须用类调用
 2、对象方法中可以直接访问属性（成员变量）
   类方法中可以直接访问属性（成员变量）
 3、类方法的优点：调用类方法的效率比调用对象方法高
 4、类方法和对象方法可以进行相互调用
     对象方法中可以直接调用类方法
     可以在类方法中间接调用对象方法（不建议）
     类方法中可以直接调用其他类方法
     对象方法中可以直接调用对象方法
 类方法的应用场景
 如果方法中没有使用到属性（成员变量），那么能用类方法就用类方法
 类方法的执行效率比对象方法高
 
 类方法一般用于定义工具方法
     字符串查找
     文件操作
     数据库操作
 */
+(int)sumWithValue1:(int)value1 andValue2:(int)value2
{
    Iphone *p = [Iphone new];
    [p call: 13235];//在企业开发中不建议这样使用
    return value1+value2;
}
@end

int main(int argc, const char * argv[]) {
//何发送消息？在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称]；
    
    //利用Iphone类型的指针保存了Iphone对象的地址，那么我们就称Iphone类型的指针p为Iphone对象
    Iphone *p = [Iphone new];
    
    //3、修改对象的属性
//    p->_size = 3.5;
//    p->_color = 0;
//    p->_model = 4;
//    p->_cpu = 1;
    
//    获取对象的属性
//    NSLog(@"size=%f,color=%i,model=%f,cpu=%i",p->_size,p->_color,p->_model,p->_cpu);
    
//    4、给对象发消息(如何调用对象的方法)
    //调用对象P中的about方法
    [p about];
    
    //OC 中的NSLog对C语言的字符串支持不好，可能不会不准确输出
//    content接收参数返回值
//    char *content = [p loadMessage];
//    NSLog(@"content=%s",content);
//
//    [p call: 1323];
    
//    [p sendMessageWithNumber:1324 antContent:"hi"];
//    int res= [p sumWithValue1:12 andValue2:11];
//    int res= [Iphone sumWithValue1:12 andValue2:11];
//    NSLog(@"res=%i",res);
    return 0;
}
//void test ()
//{
////    创建一个对象
////    Iphone *p1 = [Iphone new];
////    利用对象调用加法运算方法类方法
//    int res = [Iphone sumWithValue1:50 andValue2:20];
//    NSLog(@"res=%i",res);
//}
